import cron from 'node-cron';
import { BackupService } from '../services/backupService';

/**
 * 数据库备份定时任务
 * 每天凌晨3点自动执行数据库备份
 */
export function startBackupJob(): void {
  console.log('🕐 正在启动数据库备份定时任务...');

  // 配置cron表达式：每天凌晨3点执行 (0 3 * * *)
  const cronExpression = '0 3 * * *';
  
  // 创建定时任务
  const task = cron.schedule(cronExpression, async () => {
    const startTime = new Date();
    console.log(`\n🚀 定时备份任务开始执行 - ${startTime.toLocaleString('zh-CN')}`);
    
    try {
      const backupService = new BackupService();
      
      // 先测试OSS连接
      const ossConnected = await backupService.testOSSConnection();
      if (!ossConnected) {
        throw new Error('OSS连接失败，跳过本次备份');
      }
      
      // 执行备份
      await backupService.backupDatabase();
      
      const endTime = new Date();
      const duration = endTime.getTime() - startTime.getTime();
      console.log(`✅ 定时备份任务执行成功 - 耗时: ${Math.round(duration / 1000)}秒`);
      
    } catch (error) {
      const endTime = new Date();
      const duration = endTime.getTime() - startTime.getTime();
      console.error(`❌ 定时备份任务执行失败 - 耗时: ${Math.round(duration / 1000)}秒`);
      console.error('错误详情:', error);
      
      // 这里可以添加错误通知逻辑，比如发送邮件或钉钉消息
      // await notifyBackupFailure(error);
    }
  }, {
    timezone: 'Asia/Shanghai' // 使用中国时区
  });

  // 输出任务信息
  console.log('📅 备份任务已配置:');
  console.log(`   - 执行时间: 每天凌晨 03:00 (中国时区)`);
  console.log(`   - Cron表达式: ${cronExpression}`);
  console.log(`   - 任务状态: ${task.getStatus()}`);
  
  // 可选：立即执行一次测试（仅在开发环境）
  if (process.env.NODE_ENV === 'development') {
    console.log('🧪 开发环境检测到，是否立即执行一次测试备份？');
    console.log('   如需测试，请手动调用: npm run remote-backup');
  }
}

/**
 * 停止备份任务
 */
export function stopBackupJob(): void {
  console.log('🛑 正在停止数据库备份定时任务...');
  // 注意：这里需要保存task引用才能停止，实际使用中可能需要全局管理
  console.log('⚠️  注意：当前实现中无法直接停止任务，需要重启应用');
}

/**
 * 手动执行备份（用于测试）
 */
export async function manualBackup(): Promise<void> {
  console.log('🔧 手动执行数据库备份...');
  
  try {
    const backupService = new BackupService();
    
    // 测试OSS连接
    const ossConnected = await backupService.testOSSConnection();
    if (!ossConnected) {
      throw new Error('OSS连接失败');
    }
    
    // 执行备份
    await backupService.backupDatabase();
    console.log('✅ 手动备份执行成功');
    
  } catch (error) {
    console.error('❌ 手动备份执行失败:', error);
    throw error;
  }
}
